package com.zhixi.principle.openclosedprinciple;

import com.zhixi.principle.openclosedprinciple.operation.Book;
import com.zhixi.principle.openclosedprinciple.operation.ComputerBookImpl;
import com.zhixi.principle.openclosedprinciple.operation.NovelBook;

import java.util.ArrayList;
import java.util.List;

/**
 * 开闭原则
 *
 *  1、提高复用性
 *  2、提高可维护性
 *
 *  开闭原则是编程中最基础，最重要的设计原则
 *  一个软件实体类，模块和函数应该对扩展开放，对修改关闭，用抽象构建框架，用实现扩展细节。
 *  当软件需要改变时，尽量通过扩展软件实体的行为来实现变化，而不是通过修改已有的代码来实现变化。
 *  编程中遵循其他原则，以及使用设计模式的目的就是遵循开闭原则
 *
 * @作者 ShuHaoNan
 * @邮箱 shuhaonan1@gmail.com
 * @时间 2020/11/14 17:36
 */
public class OpenClosedPrinciple {

    private static final List<Book> bookList = new ArrayList<>();

    /* static模块初始化模拟数据 */
    static {
        bookList.add(new NovelBook("天龙八部", 3200, "金庸"));
        bookList.add(new NovelBook("巴黎圣母院", 5600, "雨果"));
        bookList.add(new NovelBook("悲惨世界", 3500, "雨果"));
        bookList.add(new NovelBook("金梅瓶", 4300, "兰陵笑笑生"));
        // 增加计算机书籍
        bookList.add(new ComputerBookImpl("Java从入门到放弃", 4300, "未知", "编程语言"));
        bookList.add(new ComputerBookImpl("Mysql从入门到删库", 4300, "未知", "数据库"));
    }

    public static void main(String[] args) {
        bookList.forEach(book -> {
            System.out.printf("书籍名称:%s\t书籍作者:%s\t书籍价格:%d\t\n", book.getName(), book.getAuthor(), book.getPrice());
        });

    }

}
